import document from '@ohos.document';

import router from '@system.router';
import prompt from '@system.prompt';

export default {
    data: {
        cxt:{},

        rowLineNum:15, //行数
        colLineNum:15, //列数
        boxSize:30, //每个棋子之间的距离，宽和高一样
        canvasWidth:15*30,
        canvasHeight:15*30,
        lineNum:15,  //总列数，行数和列数一样
        canvasSize:450, //画布的大小，宽和高一样
        boxPadding:15, //内边距

        me:true, //判断是否是自己
        over:false, //判断游戏是否已结束
        chessboard:[], //棋盘数组
        myWin:[], //自己的赢法统计
        computerWin:[], //对方的赢法统计
        wins:[], //所有的赢法统计
        count:0, //赢法统计
        //    Audio:true,
    },
    //    onshow方法由后台不可见状态切换到可见状态
    onShow() {
        //调用data数据并返回数据，拿到画布定义画布为2d维度
        this.cxt = this.$element("chess").getContext("2d");
        //调用画板背景
        this.drawBoardBackground();


        //        const bgAudio = new Audio('../../../../resources/audio/K&amp;A 初訪問 (电影《天气之子》背景音乐)-RADWIMPS.128.mp3')
        //        bgAudio.loop =true; //循环播放
    }
,

    //back按钮function方法返回主页面
    back: function(){
        router.push({
            uri:"pages/index/index"
        })
    },
    //    dt :function (){
    //        var dd = document.getElementById("dd")
    //        dd.pause()
    //    },
    //    st: function (){
    //        var dd = document.getElementById("dd")
    //        dd.play()
    //    },
    //    rs:function(){
    //        var dd = document.getElementById("dd")
    //        dd.load()
    //    },

    //定义画板内容
    drawBoardBackground() {
        //建立背景图片
        var img = new Image();
        img.src = "/common/images/11.png";
        //onload事件表示必须在事件触发后执行的Javascript代码。
        //这里我们希望建立图片后立马在矩形画板上生效
        img.onload=() =>{
            //this.cxt.drawImage(img,0,0,this.canvasWidth,this.canvasHeight+this.boxSize);
            this.drawRectangleBoard();
            //画矩形板//对“类”进行初始化的函数方法。
        }
    },
    //定义矩形画板内容（画五子棋盘线）
    drawRectangleBoard() {
        for( let i=0 ; i < this.rowLineNum ;i++ ){
            //画横线，x轴不变，y轴变化
            //开始画，beginPath() 方法开始一条路径，或重置当前的路径。

            this.cxt.beginPath();
            //水平线x轴起点页内距，到终点总宽减去页内距
            this.cxt.strokeStyle = "#ccc";
            this.cxt.moveTo(this.boxPadding,this.boxPadding+i*this.boxSize);
            //y轴，随i的增加变位置
            this.cxt.lineTo(this.canvasSize-this.boxPadding,this.boxPadding+i*this.boxSize);
            //结束画，closePath() 方法创建从当前点到开始点的路径。
            this.cxt.closePath();
            //stroke() 方法在画布上绘制确切的路径。
            this.cxt.stroke();
        }

        for( let i=0 ; i < this.colLineNum ;i++ ){
            //纵线，x轴变化，y轴不变
            this.cxt.beginPath();
            this.cxt.moveTo(this.boxPadding+i*this.boxSize,this.boxPadding);
            this.cxt.lineTo(this.boxPadding+i*this.boxSize,this.canvasHeight-this.boxPadding);
            this.cxt.closePath();
            this.cxt.stroke();
        }

    },
    //对“类”进行初始化的函数方法。
    onInit() {
        this.initWinGroup();
        this.initChessData();
        //        bgAudio.play();
    },
    //当页面销毁时，音月关闭
    //onDestroy(){
    //  bgAudio.pause();
    //},
    initWinGroup(){
        //所以的赢法无非就是横向x，纵向y，正斜方向和反斜方向
        //初始化赢法数组x、y、groupid(第几组赢法)
        for(var i=0;i<this.rowLineNum;i++){
            this.wins[i] = []
            for(var j=0;j<this.rowLineNum;j++){
                this.wins[i][j] = []
            }
        }

        //记录x赢法数组
        for(var i=0;i<this.rowLineNum;i++){
            for(var j=0;j<this.rowLineNum-4;j++){
                for(var k=0;k<5;k++){
                    this.wins[j+k][i][this.count] = true
                }
                this.count++
            }
        }

        //记录y赢法数组
        for(var i=0;i<this.rowLineNum;i++){
            for(var j=0;j<this.rowLineNum-4;j++){
                for(var k=0;k<5;k++){
                    this.wins[i][j+k][this.count] = true
                }
                this.count++
            }
        }

        //正斜线赢法数组
        for(var i=0;i<this.rowLineNum-4;i++){
            for(var j=0;j<this.rowLineNum-4;j++){
                for(var k=0;k<5;k++){
                    this.wins[i+k][j+k][this.count] = true
                }
                this.count++
            }
        }

        //反斜线赢法数组
        for(var i=0;i<this.rowLineNum-4;i++){
            for(var j=this.rowLineNum-1;j>3;j--){
                for(var k=0;k<5;k++){
                    this.wins[i+k][j-k][this.count] = true
                }
                this.count++
            }
        }
    },
    //记录数据，将数据录入到inutchessdata方法中
    initChessData(){
        for(var i=0; i<this.rowLineNum ;i++){
            this.chessboard[i] = []
            for(var j=0; j<this.rowLineNum;j++){
                this.chessboard[i][j] = 0
            }
        }
        for(let index=0; index<this.count;index++){
            this.myWin[index] = 0;
            this.computerWin[index] = 0;
        }

    },

    onPressChess(e){

        //判断游戏是否已结束，目的为了下面的判断胜负做准备
        if(this.over){
            return
        }

        //判断是否是我胜利
        if(!this.me){
            return
        }
        //        this.cxt.beginPath();
        //        this.cxt.arc(this.boxPadding*this.boxSize,this.boxSize,3,0,Math.PI*2);
        //        this.cxt.fillStyle='#000';
        //        this.cxt.fill();
        //获取点击棋盘时的位置
        let x = Math.floor(e.touches[0].localX/this.boxSize)
        let y = Math.floor(e.touches[0].localY/this.boxSize)

        //判断当前位置是否有棋子，0标识没有，1表示有
        if(this.chessboard[x][y] == 0){
            //在x和y这个位置画棋子，初始化棋子位置
            this.drawChess(x,y);

            //判断是否赢了
            this.checkWin(x,y);

            //如果游戏没有结束，则当前是个开关，AI计算机可继续下棋子
            if(!this.over){
                this.me = !this.me;
                this.computerAI()
            }
        }
    },
    //给初始化位置的棋子赋值
    drawChess(x,y){
        //在控制台输出棋子
        console.info("=====drawChess x:"+ x + " y:"+y);
        //每次落子之前，把x和y的位置设置为1，这个位置下次不能落子，这个很重要
        this.chessboard[x][y] = 1
        //给棋子坐标进行变量定义
        var px = this.boxPadding + x*this.boxSize;
        var py = this.boxPadding + y*this.boxSize;
        this.cxt.beginPath();
        //将坐标调用
        this.cxt.arc(px, py,13,0,2*Math.PI)
        this.cxt.closePath();
        //        if，else判断语句
        if(!this.me){
            this.cxt.fillStyle = "white";

        }else{
            this.cxt.fillStyle = "black"
        }
        this.cxt.fill();
    },

    checkWin(x,y){//判断是否胜利
        for(var index =0; index < this.count ;index++){
            if(this.wins[x][y][index]){
                //如果是自己，则在自己的统计中添加次数
                if(this.me){
                    this.myWin[index] += 1;
                    if(this.myWin[index] == 5){
                        this.over = true;
                        prompt.showToast({
                            message:"人生路漫漫，少年，你的努力不会白费！",
                            duration:3000//时间毫秒
                        })
                    }
                }else{
                    this.computerWin[index] += 1;
                    if(this.computerWin[index] == 5){
                        this.over = true;
                        prompt.showToast({
                            message:"花有重开日，人无在少年，加油！",
                            duration:5000,


                        });
                    }
                }
            }
        }
    },
    //判断a分值
    computerAI(){
        //计算每个子所在的分值
        var myScore = []
        var computerScore = []
        for(var i=0;i<this.rowLineNum;i++){
            myScore[i] = []
            computerScore[i] = []
            for(var j=0;j<this.rowLineNum;j++){
                myScore[i][j] = 0
                computerScore[i][j] = 0
            }
        }

        //打分
        var maxScore = 0;
        var maxX = 0;
        var maxY = 0;
        //计算maxscore
        for(var i=0;i<this.rowLineNum;i++){
            for(var j=0;j<this.rowLineNum;j++){
                //计算计算机最优的下子位置
                //棋盘上没有下子的位置
                if(this.chessboard[i][j] == 0){

                    for(var k=0;k<this.count;k++){
                        if(this.wins[i][j][k]){
                            //me
                            if(this.myWin[k] == 1){
                                myScore[i][j] += 200
                            }else if(this.myWin[k] == 2){
                                myScore[i][j] += 400
                            }else if(this.myWin[k] == 3){
                                myScore[i][j] += 1000
                            }else if(this.myWin[k] == 4){
                                myScore[i][j] += 10000
                            }

                            //computer
                            if(this.computerWin[k] == 1){
                                computerScore[i][j] += 220
                            }else if(this.computerWin[k] == 2){
                                computerScore[i][j] += 440
                            }else if(this.computerWin[k] == 3){
                                computerScore[i][j] += 1600
                            }else if(this.computerWin[k] == 4){
                                computerScore[i][j] += 30000
                            }
                        }
                    }

                    //拦截
                    // @ts-ignore
                    if(myScore[i][j] > maxScore){
                        maxScore = myScore[i][j];
                        maxX = i;
                        maxY = j;
                    }else if(myScore[i][j] == maxScore){
                        // @ts-ignore
                        if(computerScore[i][j] > maxScore){
                            maxX = i;
                            maxY = j;
                        }
                    }

                    //落子
                    // @ts-ignore
                    if(computerScore[i][j] > maxScore){
                        maxScore = computerScore[i][j];
                        maxX = i;
                        maxY = j;
                    }else if(computerScore[i][j] == maxScore){
                        // @ts-ignore
                        if(myScore[i][j] > maxScore){
                            maxX = i;
                            maxY = j;
                        }
                    }

                }
            }
        }

        this.drawChess(maxX,maxY);
        this.checkWin(maxX,maxY);
        //如果游戏么结束，那么我就没赢
        if(!this.over){
            this.me = !this.me
        }
    },
    //清理战局打扫卫生
    clearCanvas() {
        this.cxt.clearRect(0,0,this.canvasWidth,this.canvasHeight+this.boxSize);
    },
    //重定义布局
    reset(){
        this.over = false;
        this.me = true;
        this.clearCanvas();
        this.onShow();

        this.onInit();
    }
}

